/**
 * \file envoi.c
 * \author H4201
 */

/* MODULES USED */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <mqueue.h>
#include <pthread.h>

#include "envoi.h"
#include "../interface/messqueue.h"
#include "../messages/traducteur_message.h"
#include "../interface/variablesglobales.h"

/*EXPORTED FUNCTIONS*/

/**
 * Fonction qui sert de point d'entrée au thread "Envoi Linux"
 * \param parameter inutilisé ici
 */
void* envoi_linux(void *parameter) {
    // parameter n'est pas inutilisé ici
    (void)parameter;
    mqd_t bal_superviseur = mq_open(BAL_SUPERVISEUR_NAME, O_RDONLY);
    message_t message;
    
    for (;;) {
        mq_receive(bal_superviseur, (char *) &message, sizeof(message_t), NULL);
        envoyer(message, g_client_sockfd);
        if (message.type == ARRET) {
            break;
        }
    }
    mq_close(bal_superviseur);

    pthread_exit(NULL);
}

/**
 * Ecrit un ::message_t sur le socket passé en paramètre
 * \param[in] message Le message à envoyer
 * \param[in] sockfd Le descripteur du socket sur lequel écrire
 */
void envoyer(message_t message, int sockfd) {
    int n;
    char *buffer = serialiser_message(message);
    n = write(sockfd, buffer, strlen(buffer));
    free(buffer);
    if (n < 0) {
        perror("ERROR writing to socket");
    }
}
